Skip to content

refactor: migrate UI to Material 3 with unified Material Symbols icons - #370

Merged
a1denvalu3 merged 2 commits into
mainfrom
feature/material3-ui-refresh
Aug 21, 2026
Merged

refactor: migrate UI to Material 3 with unified Material Symbols icons#370
a1denvalu3 merged 2 commits into
mainfrom
feature/material3-ui-refresh

Conversation

@a1denvalu3

Copy link
Copy Markdown
Collaborator

Summary

Resources-only UI refresh (zero Kotlin/Java changes — all payment, wallet, and POS logic untouched). Migrates the app to Material 3 with a brand-derived color scheme and replaces the mixed icon set with a unified Material Symbols (outlined) set.

🎨 Material 3 theming

  • Theme.Numo (light + dark) now extends Theme.Material3.DayNight.NoActionBar
  • Full M3 color role set (primary/secondary/tertiary/error + containers, surfaceVariant, outline, surfaceContainer*, inverse roles) generated as an HCT tonal palette from the numo_green (#00C244) seed — same engine as Material Theme Builder
  • App identity preserved: neutral white/obsidian surfaces, edge-to-edge system bars, custom keypad attributes, and the ThemeManager-driven POS themes (green / obsidian / bitcoin orange / white) all work unchanged
  • Component styles re-parented M2 → M3: buttons (filled/outlined/text), TextInputLayout, snackbar, dialogs, popup menus, toolbars, modal bottom sheets
  • M3 shape alignment: 28dp corners for dialogs and modal bottom sheets

🔲 Icons

  • 80 icons replaced with official Material Symbols outlined 24dp vectors — same resource names, and each icon preserves its original fill-color token and intrinsic size, so un-tinted usages render identically
  • Fixed name/glyph mismatches: ic_bitcoin → real currency_bitcoin ₿, ic_quick_chargedialpad (matches its actual 3×3 glyph), ic_open_withshare, ic_tippaid
  • ic_language.png / contactless.png → vectors (now correctly tinted in dark mode); unused ic_lightning.png removed
  • Brand/third-party assets untouched: Numo wordmark & letters, launcher icons, Nostr/Telegram/X logos, status dots, success badge
  • SVG→VectorDrawable transform numerically verified (all glyphs land in the proper viewport)

Housekeeping

  • 5 layouts had inline Widget.MaterialComponents.Button.* style refs swapped to M3 equivalents (1:1 — no ID or structural changes, ViewBinding unaffected)

Verification

  • ./gradlew assembleDebug
  • ./gradlew testDebugUnitTest — all tests pass
  • ./gradlew lintDebug — no new issues vs. baseline
  • ✅ Verified Theme.Material3 descends from Theme.AppCompat (safe for all existing activities)

Test plan

  • Visual pass over POS, payment request, history, settings in light + dark mode
  • Verify each POS theme (green / obsidian / orange / white) still applies correctly
  • Check icon rendering in dialogs, mint lists, and onboarding

Resources-only refresh (no logic changes):

- Migrate Theme.Numo (light + dark) to Theme.Material3.DayNight with a
  full M3 color role set generated from the numo_green (#00C244) seed
  via HCT tonal palettes (m3_* tokens in colors.xml)
- Keep the app's neutral surfaces, edge-to-edge system bars, custom
  keypad attrs and the ThemeManager POS themes intact
- Re-parent component styles to M3 (buttons, TextInputLayout, snackbar,
  dialogs, popup menus, toolbars, bottom sheets); 28dp M3 corners for
  dialogs and modal bottom sheets
- Replace 80 ad-hoc icons with official Material Symbols outlined
  vectors under the same resource names (fill tokens and sizes
  preserved so untinted usages render identically)
- Convert ic_language and contactless PNGs to vectors (now day/night
  tinted); drop unused ic_lightning.png
- Keep brand/third-party assets untouched (wordmark, launcher, Nostr /
  Telegram / X logos, status dots, success badge)
- Swap 5 inline M2 button style refs in layouts to M3 equivalents
  (1:1, no ID/structure changes)

Verified: assembleDebug, testDebugUnitTest (all pass), lintDebug (no
new issues vs baseline)
Replace all hardcoded dp corner radii in the shared shape drawables
with @dimen/radius_* tokens. Values unchanged (16/28/12/26/100/18/20/
8dp map to existing tokens; adds radius_micro=2dp, radius_xs=4dp,
radius_badge=6dp, radius_s=10dp, radius_button_compact=14dp,
radius_xl=24dp for the remainder). Zero visual change.
@a1denvalu3
a1denvalu3 merged commit 061e499 into main Aug 21, 2026
4 checks passed
@github-project-automation github-project-automation Bot moved this from Backlog to Done in Numo Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant